在 Day 20 介紹了垃圾回收(garbage collected)機制。當中,提到了堆棧 / 堆(Heap)這個關鍵字。考量到它的重要性,故用這個篇幅來予以介紹。
Android 的記憶體堆棧有區分不同世代(generational),這代表不同的配置桶會根據被回收物件的預期生命、大小來追蹤這些物件。例如,最近被回收物件屬於新生代(young generation)。當一個物件保持夠長的活動時間,它會被提升至老生代(older generation)。最後則是永生代(permanent generation)。
[圖1] Java 概念下的堆棧區分
每個堆棧世代都有專用的記憶體容量佔用上限。每當某個世代被佔滿,系統會執行垃圾回收來試圖釋放記憶體。垃圾回收所需時間取決於它正在回收哪一個世代的物件,以及每個世代有多少活動中的物件。
儘管垃圾回收被非常快地執行,它仍舊會影響到應用程式的表現。通常你無法控制程序中何時要發生垃圾回收事件,系統有自己的一套標準來確認何時執行垃圾回收。當條件成就,系統停止執行程序並開始垃圾回收。
如果垃圾回收發生在敏感性程序迴圈(intensive processing loop),像是動畫、音樂播放,則可能會增加垃圾回收的處理時間。這樣增加的處理時間,可能會使應用程式的程序執行時間超過為了效能、平滑幀(影格)渲染效果而設的 16 毫秒建議閥值。
參考資料